package com.example.service;

import com.example.annotation.Loggable;
import com.example.annotation.PerformanceMonitor;
import com.example.annotation.RequiresPermission;
import org.springframework.stereotype.Service;

/**
 * 基于注解的用户服务类 - 展示注解驱动的AOP
 * 
 * 这个类展示了如何通过注解来精确控制哪些方法需要什么样的AOP处理：
 * 1. 不是所有方法都有AOP - 只有加了注解的才有
 * 2. 不同方法可以有不同的AOP行为
 * 3. 可以通过注解参数来定制AOP行为
 * 4. 可以组合多个注解实现复杂的横切逻辑
 */
@Service
public class AnnotationBasedUserService {

    /**
     * 创建用户 - 需要权限检查、日志记录、性能监控
     * 
     * 这个方法展示了多个注解的组合使用
     */
    @RequiresPermission({"USER_CREATE"})
    @Loggable(level = "INFO", message = "正在创建新用户")
    @PerformanceMonitor(threshold = 50, detailed = true)
    public String createUser(String username, String email) {
        System.out.println("=== 业务逻辑：创建用户 " + username + " ===");
        
        // 模拟数据库操作耗时
        try {
            Thread.sleep(30);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        
        return "用户创建成功: " + username + " (" + email + ")";
    }

    /**
     * 删除用户 - 需要权限检查和日志记录（但不记录返回值）
     */
    @RequiresPermission({"USER_DELETE"})  // 故意设置一个用户没有的权限，演示权限检查失败
    @Loggable(level = "WARN", logResult = false, message = "执行危险的删除操作")
    public boolean deleteUser(Long userId) {
        System.out.println("=== 业务逻辑：删除用户 " + userId + " ===");
        return true;
    }

    /**
     * 查询用户 - 只需要简单的日志记录
     */
    @Loggable(level = "DEBUG", logArgs = false)  // 不记录参数，只记录返回值
    public String getUserInfo(Long userId) {
        System.out.println("=== 业务逻辑：查询用户信息 ===");
        return "用户信息: ID=" + userId + ", Name=张三";
    }

    /**
     * 更新用户 - 需要权限和性能监控
     */
    @RequiresPermission(value = {"USER_UPDATE", "USER_READ"}, mode = RequiresPermission.Mode.ANY)  // 任一权限即可
    @PerformanceMonitor(threshold = 100)  // 不显示详细信息，只在超时时警告
    public String updateUser(Long userId, String newName) {
        System.out.println("=== 业务逻辑：更新用户 " + userId + " ===");
        
        // 模拟长时间操作
        try {
            Thread.sleep(150);  // 故意超过阈值
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        
        return "用户更新成功: " + newName;
    }

    /**
     * 获取所有用户 - 只有性能监控，没有其他AOP
     */
    @PerformanceMonitor(detailed = true)
    public String getAllUsers() {
        System.out.println("=== 业务逻辑：获取所有用户 ===");
        return "用户列表: [张三, 李四, 王五]";
    }

    /**
     * 内部方法 - 没有任何注解，不会被AOP处理
     * 
     * 这个方法展示了注解方式的优势：精确控制
     */
    public String internalMethod() {
        System.out.println("=== 业务逻辑：内部方法，无AOP处理 ===");
        return "内部方法执行完成";
    }

    /**
     * 批量操作 - 组合注解演示
     */
    @Loggable(level = "INFO", message = "执行批量操作")
    @PerformanceMonitor(threshold = 200, detailed = true)
    public String batchOperation(String[] usernames) {
        System.out.println("=== 业务逻辑：批量操作 ===");
        
        // 模拟批量处理
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        
        return "批量操作完成，处理了 " + usernames.length + " 个用户";
    }
} 